iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
JavaScript

JS 核心重構:勇者轉職傳說系列 第 9

Day 08:原理篇 —— 物件導航:如何優雅地遍歷與操作你的寶箱

  • 分享至 

  • xImage
  •  

本文同步分享於個人部落格:Liwen Chiou | Digital Architect & Full-Stack Engineer


📜 這裡的修煉規則:

孩子,在踏上今日的領地前,先坐下來喝杯酒吧。
修煉的路很長,別急著奔跑,先聽聽這份卷軸裡的古老叮嚀。

我在每一站的盡頭都為你鋪設了 實戰演武場 CodePen。那不只是程式碼的拼湊,而是你在這場暴風雨中,試圖用邏輯點燃的一顆星火。
成功突圍後,別忘了帶著你的戰利品回到 QuestBoard 佈告欄。在那裡,你會發現自己從不孤單,公會的夥伴們都正舉杯等待你的歸來。

記住...

導師看重的從來不是你的劍法有多華麗,而是當你被邏輯擊潰、滿身泥濘後,依然選擇握緊理性的劍柄,再次向真相發起衝鋒的勇氣。


🛡️ 【公會大廳:導師的修煉導讀】

「新夥伴,這是我剛收到的『地底巨魔戰利品清單』,但它是一整顆發著光、無法拆解的混沌核心。我只需要知道裡面有哪些『武器』,其他的雜質我都不想要。」我把那張擁有數十個屬性的龐大物件塞進你手裡。

你還在用 lootBox.swordlootBox.potion 手動一個一個點名嗎?這在處理只有 3 個抽屜的盒子時還行,但當面對上百個從「遠端王國(API)」傳來的資料時,你需要更現代化的掃描儀。今天,我們要學會如何優雅地開箱(遍歷),把物件裡的秘密轉化為可隨意操作的陣列清單。


💡 【導師講義:底層真相探究】

1. 三大物件掃描儀 (Modern Object Methods)

物件不像陣列(Day 04)那樣有序,它就像個充滿隔層的抽屜。若想對它進行大規模的操作,最優雅的做法就是施展「變身術」,將資訊轉化為陣列(名單)。

🛠️ 掃描儀指令

假設我們有一個遊戲道具物件:

const lootBox = {
  id: "A102",
  name: "🔥 烈焰劍",
  price: 500,
  rarity: "Epic",
};
  1. Object.keys():標籤提取器
    只要「標籤名(Key)」。最常用於檢查屬性是否存在,或者產生前端表格的表頭。

    const keys = Object.keys(lootBox); // ["id", "name", "price", "rarity"]
    
  2. Object.values():內容物提取器
    只要「內容物(Value)」。當你不在乎標籤名,只想計算數值總和(如總價)時最快。

    const values = Object.values(lootBox); // ["A102", "🔥 烈焰劍", 500, "Epic"]
    
  3. Object.entries():成對打包器
    標籤名與內容物同時打包成陣列。這是最強大的功能,讓你能像遍歷陣列一樣輕鬆遍歷物件。

    Object.entries(lootBox).forEach(([key, value]) => {
      console.log(`📦 掃描到項目 -> ${key}: ${value}`);
    });
    

🏹 導師的辨析圖:掃描儀選擇手冊

工具名稱 提取目標 產出形式 最強實戰場景
keys() 標籤名 字串陣列 檢查「有哪些欄位」
values() 內容值 資料陣列 計算「總價值、總點數」
entries() 標籤 + 內容 二維陣列 進行複雜資料轉換 (Map)

3. 邏輯流向圖解

導師的圖解心法: 想像物件是一個 「混亂的寶格」,裡面東西散落各處。keys()values()entries() 就像是三種不同的 「輸送帶掃描儀」,它們會把裏頭的東西抓出來,整齊地排列在 「名為陣列的履帶」 上送往工廠加工。

物件導航圖解


⚔️ 【戰術對抗:學長與學弟的代碼對決】

招式示範:混沌資料處理

❌ 冒險學弟:老派的雷達掃描 (for...in)

  • 負能量評級:🔴 冗長 / 🔴 容易掃到祖先遺留屬性(Prototype)
const loot = { sword: 10, potion: 5 };
for (let key in loot) {
  if (loot.hasOwnProperty(key)) {
    // 還得多寫這一行防禦
    console.log(`${key}: ${loot[key]}`);
  }
}

✅ 勇者學長:全自動掃描術 (Object.entries)

  • 利潤評級:🟢 寫法俐落 / 🟢 安全無誤
const loot = { sword: 10, potion: 5 };

// 直接將物件「炸開」成陣列,配合解構賦值 (Day 04)
Object.entries(loot).forEach(([item, count]) => {
  console.log(`🛡️ 偵察報告:${item} 剩餘 ${count} 件`);
});

🏰 【勇者精英課:邁向職人的進階架構】

寶物打包術:JSON 傳送術

當你要把整箱寶物寄回遙遠的公會總部(API)或是存進 Day 16 的庫存(LocalStorage)時,你必須把物件「序列化」成一個扁平的包裹。

  1. JSON.stringify(obj):把立體寶箱壓縮成一條郵件標籤(字串)。
  2. JSON.parse(string):把收到的包裹拆開,變回可操作的活生生寶箱。

這也是職人們最常用的 「深拷貝(Deep Copy)」 捷徑法,能幫你徹底切斷所有層級的靈魂連結。


🛖 【營火叮嚀:為什麼物件不能直接 map?】

孩子,你可能曾想過:既然物件也是容器,能不能也對它進行大規模的「全自動搜畫」?

「工具的錯位是錯誤的開始。」 物件的本質是具備標籤的「抽屜」,而非有序的「生產線」。如果你想對資料進行精密加工(就像我們明天 Day 09 要學到的陣列魔法),最優雅的做法就是先施展 Object.entries() 將它炸開,導航進陣列的世界。這不僅是為了達成目標,更是為了維持資料邏輯的純潔。


天色微亮,營火雖已燃盡,但你眼中卻閃爍著領悟的光芒。在前往演武場挑戰關卡前,我已經幫你把靈魂碎片精煉成了這份「戰術錦囊」。拿好它,今日的任務不再是負擔,而是你證明自我的舞台。去吧,公會的英雄榜在等著你的戰報。

📝 【夥伴筆記:今日修煉精華】

這份筆記是你的隨身護身符,卡關時看一眼,真相就在裡面。
  • Object.keys/values:快速提取單一面向的名單。
  • Object.entries:最彈性的開箱法,將物件導航至陣列處理。
  • JSON 轉化:物件與字串之間的跨維度轉換(資料持久化、深拷貝)。

🎯 【實戰演武場】

⚔️ 任務鑑定條件:

  1. 完成 📜 本日實戰任務:原理篇 —— 物件導航:如何優雅地遍歷與操作你的寶箱 (CodePen)
  2. 將 CodePen 網址貼至 QuestBoard,並回填鑑定報告:
    • 初心者:掃描儀直覺感 (成就感發掘)
        1. 當你第一次看到物件內容整齊地排成名單(陣列)「吐」出來時,你覺得哪個方法最有魔力?
    • 冒險者:數據統計策略 (理性挑戰)[⚡ 觀念辨析]
        1. 如果我們想計算一個物件中所有數值屬性的總合(例如總攻擊力),你會建議夥伴用 keys 還是 values?為什麼?
  3. 任務完成後,你的名字將永遠標記在公會的英雄榜上!

📚 【圖書館卷軸:延伸學習】


上一篇
Day 07:原理篇 —— 記憶膠囊:閉包與守護結界
下一篇
Day 09:原理篇 —— 陣列大戰:從傳統 for 到自動化生產線 map / filter
系列文
JS 核心重構:勇者轉職傳說11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言